package org.aeon.fasttasks.core.util;

/**
 * @author aeon
 * @createTime 2025/08/07  09:55
 * @description
 */

import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVPrinter;
import org.apache.commons.csv.QuoteMode;

import java.io.File;
import java.io.IOException;
import java.io.Writer;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;
import java.util.List;

/**
 * @author aeon
 * @createTime 2025/08/07  11:40
 * @description CSV 文件操作工具类
 */
public class CsvUtils {

    /**
     * 确保指定路径的目录存在
     *
     * @param path 文件路径
     * @throws IOException 如果目录创建失败
     */
    public static void ensureDirectoryExists(Path path) throws IOException {
        Path parent = path.getParent();
        if (parent != null && !Files.exists(parent)) {
            Files.createDirectories(parent);
        }
    }

    /**
     * 创建 CSV 文件写入器
     *
     * @param path 文件路径
     * @return CSVPrinter 对象
     * @throws IOException 如果文件创建或打开失败
     */
    public static CSVPrinter createCsvPrinter(Path path) throws IOException {
        Writer writer = Files.newBufferedWriter(path,
                StandardOpenOption.CREATE,
                StandardOpenOption.APPEND);

        return new CSVPrinter(writer,
                CSVFormat.Builder.create()
                        .setQuoteMode(QuoteMode.MINIMAL)
                        .setNullString("")
                        .setRecordSeparator(System.lineSeparator())
                        .build());
    }

    /**
     * 写入 CSV 文件头
     *
     * @param csvPrinter CSV 写入器
     * @param headers    表头列表
     * @throws IOException 如果写入失败
     */
    public static void writeHeaders(CSVPrinter csvPrinter, List<String> headers) throws IOException {
        if (headers != null && !headers.isEmpty()) {
            csvPrinter.printRecord(headers);
            csvPrinter.flush();
        }
    }

    /**
     * 写入单条 CSV 记录
     *
     * @param csvPrinter CSV 写入器
     * @param record     记录数据列表
     * @throws IOException 如果写入失败
     */
    public static void writeRecord(CSVPrinter csvPrinter, List<String> record) throws IOException {
        csvPrinter.printRecord(record);
        csvPrinter.flush();
    }

    /**
     * 检查 CSV 文件是否为空
     *
     * @param filePath 文件路径
     * @return true 如果文件不存在或为空，否则返回 false
     */
    public static boolean isFileEmpty(String filePath) {
        File file = new File(filePath);
        return !file.exists() || file.length() == 0;
    }


    /**
     * 批量写入 CSV 记录
     *
     * @param csvPrinter CSV 写入器
     * @param records    多条记录数据
     * @throws IOException 如果写入失败
     */
    public static void writeRecords(CSVPrinter csvPrinter, List<List<String>> records) throws IOException {
        for (List<String> record : records) {
            csvPrinter.printRecord(record);
        }
        csvPrinter.flush();
    }
}
